﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CalcDeNovo
{
    public enum Operacoes { Indefinida, Soma, Subtracao, Multiplicacao, Divisao };


    public partial class FormCalc : Form
    {
        public FormCalc()
        {
            InitializeComponent();
        }

        double valorAnterior = 0;
        double valorSalvo = 0;
        double valorBkp = 0;
        bool segundoValor = false;
        bool cliqueiResultado = false;
        bool novoDigito = false;
        string operador;
        Operacoes operacao = Operacoes.Indefinida;

        private void digitoClick(object sender, EventArgs e)
        {
            buttonResultado.Focus();

            if (textBoxDisplay.Text == "0" && (sender as Button).Text != "," || novoDigito == true)
            {
                if (!novoDigito)
                ValorAnteriorDisplay.Text = String.Empty;
                textBoxDisplay.Text = (sender as Button).Text;
            }
            else if ((sender as Button).Text == "," && textBoxDisplay.Text.Contains(","))
                textBoxDisplay.Update();
            else
                textBoxDisplay.Text += (sender as Button).Text;
            novoDigito = false;
        }

        public void Teclas(bool ativarTeclas)
        {
            button0.Enabled = ativarTeclas;
            button1.Enabled = ativarTeclas;
            button2.Enabled = ativarTeclas;
            button3.Enabled = ativarTeclas;
            button4.Enabled = ativarTeclas;
            button5.Enabled = ativarTeclas;
            button6.Enabled = ativarTeclas;
            button7.Enabled = ativarTeclas;
            button8.Enabled = ativarTeclas;
            button9.Enabled = ativarTeclas;
            buttonBackSpace.Enabled = ativarTeclas;
            buttonDivisao.Enabled = ativarTeclas;
            buttonInverterSinal.Enabled = ativarTeclas;
            buttonMemoryClear.Enabled = ativarTeclas;
            buttonMemoryRecover.Enabled = ativarTeclas;
            buttonMemorySave.Enabled = ativarTeclas;
            buttonMultiplicacao.Enabled = ativarTeclas;
            buttonNumeroOposto.Enabled = ativarTeclas;
            buttonPorcentagem.Enabled = ativarTeclas;
            buttonResultado.Enabled = ativarTeclas;
            buttonSoma.Enabled = ativarTeclas;
            buttonSubtracao.Enabled = ativarTeclas;
            buttonVirgula.Enabled = ativarTeclas;
        }

        private void buttonBackSpace_Click(object sender, EventArgs e)
        {
            textBoxDisplay.Text = textBoxDisplay.Text.Remove(textBoxDisplay.Text.Length - 1);  // remove o ultimo digito do display
            if (textBoxDisplay.Text == "0" || textBoxDisplay.Text == String.Empty)             // se o display ficar com valor igual a '0' ou vazio...
                textBoxDisplay.Text = "0";                                                     // então display recebe '0'
        }

        public void DefinirOperacao(Operacoes operacao)
        {
            this.operacao = operacao;
        }

        public void Contas()
        {
            if (segundoValor)
            {
                if (!cliqueiResultado)
                    valorSalvo = Convert.ToDouble(textBoxDisplay.Text);

                switch (operacao)
                {
                    case Operacoes.Soma:
                        valorAnterior += valorSalvo;
                        break;
                    case Operacoes.Subtracao:
                        valorAnterior -= valorSalvo;
                        break;
                    case Operacoes.Multiplicacao:
                        valorAnterior *= valorSalvo;
                        break;
                    case Operacoes.Divisao:
                        if (valorSalvo == 0)
                        {
                            textBoxDisplay.Text = "Impossível dividir por 0";
                            Teclas(false);
                        }
                        else
                            valorAnterior /= valorSalvo;
                        break;
                }
                textBoxDisplay.Text = Convert.ToString(valorAnterior);
            }
            segundoValor = true;
            valorAnterior = Convert.ToDouble(textBoxDisplay.Text);
        }

        public void Modificadores()
        {
            ValorAnteriorDisplay.Text += Convert.ToDouble(textBoxDisplay.Text) + operador;
            novoDigito = true;
            cliqueiResultado = false;
            Contas();
        }

        private void buttonSoma_Click(object sender, EventArgs e)
        {
            operador = "+";
            Modificadores();
            operacao = Operacoes.Soma;
        }

        private void buttonSubtracao_Click(object sender, EventArgs e)
        {
            operador = "-";
            Modificadores();
            operacao = Operacoes.Subtracao;
        }

        private void buttonMultiplicacao_Click(object sender, EventArgs e)
        {
            operador = "*";
            Modificadores();
            operacao = Operacoes.Multiplicacao;
        }

        private void buttonDivisao_Click(object sender, EventArgs e)
        {
            operador = "/";
            Modificadores();
            operacao = Operacoes.Divisao;
        }

        private void buttonResultado_Click(object sender, EventArgs e)
        {
            Contas();
            ValorAnteriorDisplay.Text = String.Empty;
            cliqueiResultado = true;
        }

        private void buttonClear_Click(object sender, EventArgs e)
        {
            Teclas(true);
            valorAnterior = 0;
            valorSalvo = 0;
            segundoValor = false;
            cliqueiResultado = false;
            novoDigito = false;
            textBoxDisplay.Text = "0";
            ValorAnteriorDisplay.Text = String.Empty;
        }

        private void buttonInverterSinal_Click(object sender, EventArgs e)
        {
            textBoxDisplay.Text = Convert.ToString(Convert.ToDouble(textBoxDisplay.Text) * -1);
        }

        private void buttonMemorySave_Click(object sender, EventArgs e)
        {
            valorBkp = Convert.ToDouble(textBoxDisplay.Text);
        }

        private void buttonMemoryRecover_Click(object sender, EventArgs e)
        {
            textBoxDisplay.Text = Convert.ToString(valorBkp);
        }

        private void buttonMemoryClear_Click(object sender, EventArgs e)
        {
            valorBkp = 0;
        }

        private void buttonNumeroOposto_Click(object sender, EventArgs e)
        {
            textBoxDisplay.Text = Convert.ToString(1 / Convert.ToDouble(textBoxDisplay.Text));
        }

        private void buttonPorcentagem_Click(object sender, EventArgs e)
        {
            // em fase de implementação...
            MessageBox.Show("Essa funcionalidade ainda não está implementada!");
        }

        private void FormCalc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad1 || e.KeyCode == Keys.D1)
                button1.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad2 || e.KeyCode == Keys.D2)
                button2.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad3 || e.KeyCode == Keys.D3)
                button3.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad4 || e.KeyCode == Keys.D4)
                button4.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad5 || e.KeyCode == Keys.D5)
                button5.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad6 || e.KeyCode == Keys.D6)
                button6.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad7 || e.KeyCode == Keys.D7)
                button7.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad8 || (!e.Shift && e.KeyCode == Keys.D8))
                button8.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad9 || e.KeyCode == Keys.D9)
                button9.PerformClick();
            else if (e.SuppressKeyPress = e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.D0)
                button0.PerformClick();
            else if (e.SuppressKeyPress = e.Shift && e.KeyValue == 187 || e.KeyValue == 107)
                buttonSoma.PerformClick();
            else if (e.SuppressKeyPress = e.KeyValue == 189 || e.KeyValue == 109)
                buttonSubtracao.PerformClick();
            else if (e.SuppressKeyPress = e.Shift && e.KeyValue == 56 || e.KeyValue == 106)
                buttonMultiplicacao.PerformClick();
            else if (e.SuppressKeyPress = e.KeyValue == 191 || e.KeyValue == 111)
                buttonDivisao.PerformClick();
            else if (e.SuppressKeyPress = e.KeyValue == 13 || e.KeyValue == 111)
                buttonResultado.PerformClick();
            else if (e.SuppressKeyPress = e.KeyValue == 27)
                buttonClear.PerformClick();
            else if (e.SuppressKeyPress = e.KeyValue == 8)
                buttonClear.PerformClick();
        }



    }
}
